﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Clases;

namespace Datos
{
    public class datOrdenCompra
    {
        public List<clsReferencia> ConsultarTallaXTipo (int codigo){
            List<clsReferencia> listref = new List<clsReferencia>();
             try
            {
                clsReferencia refer = new clsReferencia();
                General_Entities enti = new General_Entities();
                var con = enti.Consultar_TallaXTipo (codigo);
                foreach (var item in con)
                {
                    refer.codigo= Convert.ToInt32(item.codigo);
                    refer.descripcion = Convert.ToString(item.descripcion);
                    listref.Add(refer);
                }
                return listref;
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                Console.WriteLine("Error datOrden: " + ex);
                return null;
            }
        }


        /*Nombre: ConsultarProveedor.
        * Descripción: función que me realiza una consulta a la base pro medio de Pa_ConsultaProveedor
        *               y me devuelve los datos de los proveedores vinculados a una empresa.
        * Parámetros: código de la empresa.
        * Retorna: Lista de todas las empresas vinculadas como proveedor.
        * Autor: Alvaro Guachisaca 2014-01-29.
        * Modificación: ninguna.
        */
        public List<clsProveedor> ConsultarProveedor(Decimal id_Empresa)
        {
            List<clsProveedor> listaempresa = new List<clsProveedor>();
            try
            {
                General_Entities enti = new General_Entities();
                var con = enti.Consultar_proveedor(id_Empresa);
                foreach (var item in con)
                {
                    clsProveedor proveedor = new clsProveedor();
                    proveedor.Codigo= Convert.ToInt32(item.codigo);
                    proveedor.Nombre = Convert.ToString(item.nombre);
                    proveedor.Telefono = Convert.ToString(item.Telefono);
                    proveedor.Correo = Convert.ToString(item.descripcion);
                    listaempresa.Add(proveedor);
                }
                return listaempresa;
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                Console.WriteLine("Error al Consultar el proveedor en la capa de Datos: " + ex);
                return null;
            }
        }


        /*Nombre: ConsultarProveedorOrden.
        * Descripción: función que me realiza una consulta a la base pro medio de Pa_ProveedorOrden
        *               y me devuelve los datos del proveedor que se seleccionó en el popup.
        * Parámetros: código del proveedor.
        * Retorna: un clsProveedorOrden con todos la información del proveedor que se seleccionó.
        * Autor: Alvaro Guachisaca 2014-02-02.
        * Modificación: ninguna.
        */
        public clsProveedorOrden ConsultarProveedorOrden(int id_proveedor)
        {
            try
            {
                clsProveedorOrden proveedor = new clsProveedorOrden();
                General_Entities enti = new General_Entities();
                var con = enti.Consultar_Proveedor_PO(id_proveedor);
                foreach (var item in con)
                {
                    
                    proveedor.Codigo = Convert.ToInt32(item.codigo);
                    proveedor.VendorName = Convert.ToString(item.nombre);
                    proveedor.ContactName = Convert.ToString(item.contacto);
                    proveedor.Phone = Convert.ToString(item.telefono);
                    proveedor.Fax = Convert.ToString(item.fax);
                    proveedor.Email = Convert.ToString(item.mail);
                    proveedor.Address = Convert.ToString(item.direccion);
                    proveedor.Fda = 0;
                }
                return proveedor;
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                Console.WriteLine("Error al Consultar el Proveedor en la capa de Datos: " + ex);
                return null;
            }
        }


        /*Nombre: Guardar Cabecera.
        * Descripción: función que me permite guardar todos los datos que pertenecen a al acabecera de una orden de compra.
        * Parámetros: recibe una objeta clsOrden
        * Retorna: true o false segun la operación se haya realizado con éxito
        * Autor: Alvaro Guachisaca 2014-01-29.
        * Modificación: ninguna.
        */

        public bool GuardarCabeceraOrden(clsOrdenCompra cabecera)
        {
            try
            {
                using (General_Entities enti = new General_Entities())
                {
                    FacturaCamaron cab = new FacturaCamaron()
                    {
                        empresa = cabecera.Empresa,
                        usuario = cabecera.Usuario,
                        numero = cabecera.Numero,
                        subgrupo = cabecera.Subgrupo,
                        proveedor = cabecera.Proveedor,
                        importador = cabecera.Importador,
                        fechaCreacion = cabecera.FechaCreacion,
                        termEnvio = cabecera.TermEnvio,
                        termPago = cabecera.TermPago,
                        trasbordo = cabecera.Trasbordo,
                        fechaETD = cabecera.FechaETD,
                        fechaETA = cabecera.FechaETA,
                        envioParcial = cabecera.EnvioParcial,
                        puertoDescarga = cabecera.PuertoDescarga,
                        destinoFinal = cabecera.DestinoFinal,
                        estado = cabecera.Estado,
                        avance = cabecera.Avance,
                        //padre = cabecera.Padre

                    };
                    enti.AddToFacturaCamaron(cab);
                    enti.SaveChanges();
                }

                return true;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error al Insertar el  en la capa de Datos: " + ex);
                return false;
            }

        }


        /*Nombre: Guardar Cabecera.
        * Descripción: función que me permite actualizar los datos que pertenecen a al cabecera de una orden de compra.
        * Parámetros: recibe una objeta clsOrdenCompra
        * Retorna: true o false segun la operación se haya realizado con éxito
        * Autor: Alvaro Guachisaca 2014-02-05.
        * Modificación: ninguna.
        */
        public bool ActualizarCabeceraOrden(clsOrdenCompra cabecera, Decimal id_empresa, int numero_order)
        {
            try
            {
                using (General_Entities enti = new General_Entities())
                {
                    //busca el registro en la base
                    var x = (from a in enti.FacturaCamaron where a.empresa == id_empresa && a.numero == numero_order select a).First();
                    x.empresa = id_empresa;
                    x.numero = numero_order;
                    x.subgrupo = 1;
                    x.usuario = cabecera.Usuario;
                    x.proveedor = cabecera.Proveedor;
                    x.importador = cabecera.Importador;
                    x.fechaCreacion = cabecera.FechaCreacion;
                    x.termEnvio = cabecera.TermEnvio;
                    x.termPago = cabecera.TermPago;
                    x.trasbordo = cabecera.Trasbordo;
                    x.fechaETD = cabecera.FechaETD;
                    x.fechaETA = cabecera.FechaETA;
                    x.envioParcial = cabecera.EnvioParcial;
                    x.puertoDescarga = cabecera.PuertoDescarga;
                    x.destinoFinal = cabecera.DestinoFinal;
                    x.estado = cabecera.Estado;
                    x.avance= cabecera.Avance;
                    //x.padre = cabecera.Padre;
                    enti.SaveChanges();
                }

                return true;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error al Modificar Cabecera en la capa de Datos: " + ex);
                return false;
            }

        }


        /*Nombre: Guardar_Detalle_PurchaseOrder.
        * Descripción: función que me permite guardar los detalles que pertenecen a una cabecera en cuestión.
        * Parámetros: recibe una objeto de tipo clsDetalleOrden.
        * Retorna: true o false segun la operación se haya realizado con éxito
        * Autor: Alvaro Guachisaca 2014-01-29.
        * Modificación: ninguna.
        */
        public bool Guardar_Detalle_PurchaseOrder(List<clsDetalleOrden> lista_detalle)
        {
            try
            {
                clsDetalleOrden detalle = new clsDetalleOrden();
                int id = getIdSiguiente();
                detalle.Factura = id - 1;
                using (General_Entities ent = new General_Entities())
                { //se instancia el entity para poder usar los nombres de las tablas
                    //se hace el ingreso de cada detalle que existe en la lista
                    int cantidad = lista_detalle.Count();
                    int i = 0;
                    while (i < cantidad)
                    {
                        detalle = lista_detalle[i];
                        DetalleFacturaCamaron order_detalle = new DetalleFacturaCamaron()
                        {
                            empresa = detalle.Empresa,
                            numero = detalle.Factura,
                            linea = detalle.Linea,
                            tipo = detalle.Tipo,
                            talla = detalle.Talla,
                            marca = detalle.Marca,
                            cajas = detalle.Cajas,
                            packing = detalle.Packing,
                            porcentaje = detalle.Porcentaje,
                            tail = detalle.Tail,
                            glaseado = detalle.Glaseado,
                            quimico = detalle.Quimico,
                            pesoNeto = detalle.PesoNeto,
                            pesoBruto = detalle.PesoBruto,
                            precio = detalle.Precio,
                            observacion = detalle.Observacion
                        };
                        ent.AddToDetalleFacturaCamaron(order_detalle);
                        ent.SaveChanges();
                        i++;
                    }

                }
                return true;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error al guardar el detalle de la Orden de Compra: " + ex);
                return false;
            }
        }


        /*Nombre: getIdSiguiente.
        * Descripción: función que me permite obtener el id siguiente de la tabla Cabecera de la Orden de Compra
        * Parámetros: ninguno.
        * Retorna: un entero indicando el id siguiente.
        * Autor: Alvaro Guachisaca 2014-01-29.
        * Modificación: ninguna.
        */
        public int getIdSiguiente()
        {
            try
            {
                General_Entities ent = new General_Entities();
                int x = Convert.ToInt32(((from a in ent.FacturaCamaron select a.numero).Max())) + 1;
                return x;
            }
            catch (Exception e)
            {
                Console.WriteLine("Error al obtener el id siguiente: " + e);
                return 1; //en caso de que no exista algun registro
            }
        }




        /*Nombre: getLineaSiguiente.
        * Descripción: función que me permite obtener el numero de linea siguiente de la tabla detalle OrdenFacturaCamaron
        * Parámetros: numero de la factura.
        * Retorna: un entero indicando el id siguiente.
        * Autor: Alvaro Guachisaca 2014-01-29.
        * Modificación: ninguna.
        */
        public int getLineaSiguiente(int numero_orden,Decimal id_Empresa)
        {
            try
            {
                General_Entities ent = new General_Entities();
                int x = Convert.ToInt32(((from a in ent.DetalleFacturaCamaron where a.numero == numero_orden && a.empresa == id_Empresa select a.linea).Max())) + 1;
                return x;
            }
            catch (Exception e)
            {
                Console.WriteLine("Error al obtener el numero de linea siguiente: " + e);
                return 1; //en caso de que no exista algun registro
            }
        }



        /*Nombre: getIdSiguiente.
        * Descripción: función que retorna el detalle de una orden de compra en una lista según su cabecera y la empresa
        * Parámetros: numero de cabecera, y codigo de la empresa.
        * Retorna: Lista con el detalle de una orden de compra específica
        * Autor: Alvaro Guachisaca 2014-01-29.
        * Modificación: ninguna.
        */
        //metodo que retorna el detalle de una pedido según su cabecera

        public List<clsDetalleOrden> Consultar_Detalle_PurchaseOrder(int NumeroCabecera,int idEmpresa)
        {
            try
            {
                using (General_Entities entity = new General_Entities())
                {
                    List<clsDetalleOrden> listaDetalle = new List<clsDetalleOrden>();
                    var x = (from a in entity.DetalleFacturaCamaron where a.numero == NumeroCabecera && a.empresa == idEmpresa select a);
                    foreach (var item in x)
                    {
                        clsDetalleOrden detalle = new clsDetalleOrden();
                        detalle.Empresa = item.empresa;
                        detalle.Factura = item.numero;
                        detalle.Linea = item.linea;
                        detalle.Tipo = item.tipo;
                        detalle.Talla = item.talla;
                        detalle.Marca = item.marca;
                        detalle.Cajas = item.cajas;
                        detalle.Packing = item.packing;
                        detalle.Porcentaje = Convert.ToDecimal(item.porcentaje);
                        detalle.Tail = Convert.ToBoolean(item.tail);
                        detalle.Glaseado = Convert.ToDecimal(item.glaseado);
                        detalle.Quimico = item.quimico;
                        detalle.PesoNeto = item.pesoNeto;
                        detalle.PesoBruto = item.pesoBruto;
                        detalle.Precio = item.precio;
                        detalle.Observacion = item.observacion;
                        listaDetalle.Add(detalle);
                    }
                    return listaDetalle;
                }

            }
            catch (Exception e)
            {
                Console.WriteLine("Error: " + e);
                return null;
            }
        }
    }
}
